home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
t_os
/
head_exp
/
head.asm
next >
Wrap
Assembly Source File
|
1991-10-18
|
12KB
|
838 lines
DEBUG EQU 0
;********************************************************
;
; ☆★☆ ヘッド表示プログラム ☆★☆
;
; by Yasu.Hara.
;
; Ver1.23 (1990/10/09)
;
;********************************************************
ASSUME CS:CSEG,DS:DSEG,SS:SSEG
;********************************************************************
IF DEBUG
PUBLIC OFFSETX,OFFSETY,ZOOM,PADWORK,INPUT_KEY
READPAG EQU 10
DRIVE EQU 'H'
ELSE
READPAG EQU 100
DRIVE EQU 'Q'
ENDIF
READNUM EQU READPAG*10
HEADLEN EQU 512*3*READNUM
PALTLEN EQU 32*3
IMG_LEN EQU 128*1024
EGBSIZE EQU 1536
;********************************************************************
CSEG SEGMENT DWORD PUBLIC USE32 'CODE'
AND ESP,-4
MOV AX,110H
MOV FS,AX
;ドライブ R ガ アルカ チェック
MOV AX,3D00H
MOV EDX,OFFSET RUN386
INT 21H
SETNC BYTE PTR [EXIST_R]
;
MOV BX,AX
MOV AH,3EH
INT 21H
;CD ドライブ テイシ ジカン ノ セッテイ
MOV DL,1
CALL CD_TIME
;シリンダ 0 ヘノ シーク
SEEK_0:
MOV AX,3C0H
MOV CH,0
INT 93H
TEST AH,AH
JNZ SEEK_0
;キーボードクリック オン ノ セイギョ
MOV AX,501H
INT 90H
;FM オンゲン ノミノ ショキカ
MOV AH,30H
CALL SOUND_CALL
;グラフィック ショキカ
MOV AH,0
MOV ECX,EGBSIZE
CALL EGB_CALL
;カソウガメン ノ セッテイ
MOV AX,100H
MOV DX,10
CALL EGB_CALL
MOV AX,101H
MOV DX,5
CALL EGB_CALL
CALL OFFSET_0
;ビョウガショク ノ セッテイ
MOV AX,701H
MOV DX,7FFFH
CALL EGB_CALL
;スプライト ショキカ
CALL INIT_SPRITE
;
CALL CLEAR_SCREEN
JMP SHORT RETRY
;CD-ROM リードエラー
ERROR_TRAP:
MOV ESI,OFFSET ERROR_$
CALL PRINT_MSG
;
MOV AX,900H
INT 90H
;データリード ノ リトライ
RETRY:
MOV ESI,OFFSET WAIT_$
CALL PRINT_MSG
;パレット データ ヲ メモリー ヘ ヨミコム
MOV AX,3D00H
MOV EDX,OFFSET PALTFIL
INT 21H
JC ERROR_TRAP
;
MOV BX,AX
MOV AH,3FH
MOV ECX,PALTLEN
MOV EDX,OFFSET PALTWRK
INT 21H
JC ERROR_TRAP
;
MOV AH,3EH
INT 21H
JC ERROR_TRAP
;ヘッド データ ヲ メモリー ヘ ヨミコム
MOV AX,3D00H
MOV EDX,OFFSET HEADFIL
INT 21H
JC ERROR_TRAP
MOV [HANDLE],AX
;
MOV BX,AX
MOV AX,4202H
XOR ECX,ECX
XOR EDX,EDX
INT 21H
JC ERROR_TRAP
;
MOV CX,512*3
DIV CX
MOV [HEADMAX],AX
MOV EDI,OFFSET MAX_$
CALL CONVERT_D
;
CALL READ_CD
;ガメン ノ ヒョウジ
MOV AX,101H
MOV CX,120
CALL SPRITE_CALL
;アトリビュート セッテイ
MOV BX,3*10
MOV CX,1024-120
ATTR_SET:
MOV AH,5
MOV DX,202H
LEA ESI,[ECX+8000H]
MOV DI,8100H
CALL SPRITE_CALL
ADD CX,4
DEC BX
JNZ SHORT ATTR_SET
;イチ セッテイ
MOV CX,1024-120
XOR EBP,EBP
XYZSET_X:
MOV DI,46
MOV BH,5
XYZSET_Y:
MOV SI,BP
MOV BL,3
XYZSET_Z:
MOV AX,400H
MOV DX,202H
CALL SPRITE_CALL
ADD CX,4
ADD SI,33
DEC BL
JNZ SHORT XYZSET_Z
ADD DI,36
DEC BH
JNZ SHORT XYZSET_Y
TEST EBP,EBP
MOV BP,136
JZ SHORT XYZSET_X
;
CALL CLEAR_SCREEN
MOV ESI,OFFSET LINE$
CALL PRINT_MSG
;
MAIN_LOOP:
XOR EDX,EDX
MOV AX,[HEADNUM]
DEC AX
MOV CX,10
DIV CX
IMUL AX,CX
MOV [HEADOFF],AX
XOR EDX,EDX
MOV CX,READNUM
DIV CX
CMP [HPAGE],AX
JZ SHORT SAME_PAGE
MOV [HPAGE],AX
CALL READ_CD
SAME_PAGE:
XOR EBX,EBX
MOV EDI,OFFSET NUMBER$
NUM_LOOP:
INC BL
ADD EDI,6
MOV AX,[HEADOFF]
ADD AX,BX
CMP AX,[HEADMAX]
JBE SHORT NUM_LOOP1
MOV EAX,20202020H
STOSD
JMP SHORT NUM_LOOP2
NUM_LOOP1:
CALL CONVERT_D
NUM_LOOP2:
CMP BL,10
JNZ SHORT NUM_LOOP
;
MOV ESI,OFFSET NUMBER$
CALL PRINT_MSG
;スプライト ノ テイギ
MOV BH,10
MOV CX,1024-120
MOV BP,[HEADOFF]
DEF_LOOP:
MOV ESI,OFFSET CLR_PAT
XOR EDI,EDI
CMP BP,[HEADMAX]
JNC SHORT DEF_CLR
XOR EDX,EDX
MOV AX,BP
MOV SI,READNUM
DIV SI
MOVZX EAX,DX
SAL EAX,9
LEA ESI,[EAX+EAX*2+HEADWRK]
MOV DI,512
DEF_CLR:
MOV BL,3
DEF_DRCTN:
MOV AX,200H
MOV DX,202H
CALL SPRITE_CALL
ADD ESI,EDI
ADD CX,4
DEC BL
JNZ SHORT DEF_DRCTN
INC BP
DEC BH
JNZ SHORT DEF_LOOP
;パレットブロック ノ セッテイ
MAIN_LOOP2:
MOVZX ESI,BYTE PTR [PALTNUM]
SAL SI,5
ADD ESI,OFFSET PALTWRK
MOV AH,3
MOV CX,256
MOV DX,1
CALL SPRITE_CALL
;
INPUT_KEY:
MOV AX,901H
INT 90H
MOV BX,[PALTNUM]
MOV CX,[HEADNUM]
CMP DL,'0'
JC SHORT NOT_NUMBER
CMP DL,'9'+1
JC NUMBER_KEY
NOT_NUMBER:
CMP DL,0DH
JZ RETURN_KEY
SUB DL,1BH
JZ ESCAPE_KEY
DEC DL
JZ RIGHT_ARROW
DEC DL
JZ LEFT_ARROW
DEC DL
JZ UP_ARROW
DEC DL
JZ DOWN_ARROW
DEC DL
JNZ SHORT NOT_SPACE_KEY
CALL ZOOM_0
JMP SHORT INPUT_KEY
;
NOT_SPACE_KEY:
MOV BL,3FH
MOV DH,1
PAD_LOOP:
MOV AH,40H
CALL SOUND_CALL
TEST DL,0FH
JZ SHORT PAD_SKIP
AND BL,DL
PAD_SKIP:
DEC DH
JZ SHORT PAD_LOOP
;
MOV DL,BYTE PTR [PADWORK]
OR DL,0FH
MOV BYTE PTR [PADWORK],BL
NOT BL
AND BL,DL
JZ INPUT_KEY
;
MOV AX,[ZOOM]
TEST BL,20H
JZ SHORT NOT_ZOOM_DOWN
DEC AL
NOT_ZOOM_DOWN:
TEST BL,10H
JZ SHORT NOT_ZOOM_UP
INC AL
NOT_ZOOM_UP:
CMP AL,15
JNC SHORT NOT_ZOOM
CMP AX,[ZOOM]
JZ SHORT NOT_ZOOM
MOV [ZOOM],AX
CALL DISP_START
JMP INPUT_KEY
;
NOT_ZOOM:
MOV AX,[OFFSETX]
TEST BL,8
JZ SHORT NOT_RIGHT
INC AX
NOT_RIGHT:
TEST BL,4
JZ SHORT NOT_LEFT
DEC AX
NOT_LEFT:
CMP AX,200
JZ SHORT NOT_RL
CMP AX,-40
JZ SHORT NOT_RL
MOV [OFFSETX],AX
NOT_RL:
;
MOV AX,[OFFSETY]
TEST BL,2
JZ SHORT NOT_UP
INC AX
NOT_UP:
TEST BL,1
JZ SHORT NOT_DOWN
DEC AX
NOT_DOWN:
CMP AX,208
JNC SHORT NOT_UD
MOV [OFFSETY],AX
NOT_UD:
;
CALL OFFSET_CHG
JMP INPUT_KEY
RETURN_KEY:
MOV BL,2
UP_ARROW:
SUB BL,2
DOWN_ARROW:
INC BL
CMP BL,3
JNC INPUT_KEY
MOV [PALTNUM],BX
;
ADD BL,'0'
MOV [PAL_$],BL
;
MOV ESI,OFFSET ATTR_$
CALL PRINT_MSG
;
JMP MAIN_LOOP2
RIGHT_ARROW:
ADD CX,20
LEFT_ARROW:
SUB CX,10
CHK_NUM:
JZ INPUT_KEY
CMP CX,[HEADMAX]
JA INPUT_KEY
MOV [HEADNUM],CX
JMP MAIN_LOOP
NUMBER_KEY:
SUB DL,'0'
MOVZX CX,DL
MOV AX,[INPUT]
XOR EDX,EDX
MOV BX,1000
DIV BX
IMUL DX,10
ADD CX,DX
MOV [INPUT],CX
JMP CHK_NUM
ESCAPE_KEY:
;セイジョウ シュウリョウ
MOV AH,3EH
MOV BX,[HANDLE]
INT 21H
;
MOV AX,100H
MOV CX,120
CALL SPRITE_CALL
;
CALL OFFSET_0
;
MOV EDX,1
CALL DISP_PAGE
;
MOV AX,[EXIST_R]
TEST AX,AX
JNZ SHORT RETRY2
;
CALL CLEAR_SCREEN
MOV ESI,OFFSET EXIT_$
CALL PRINT_MSG
;
MOV AX,900H
INT 90H
;
JMP SHORT EXIT_PRG
;
ERROR_TRAP2:
CALL CLEAR_SCREEN
MOV ESI,OFFSET ERROR2$
CALL PRINT_MSG
;
MOV AX,900H
INT 90H
;
;DRIVE_R.IMG ヲ ヨミコム
RETRY2:
CALL CLEAR_SCREEN
MOV ESI,OFFSET TMENU_$
CALL PRINT_MSG
;
MOV AX,3D00H
MOV EDX,OFFSET DRIVE_R
INT 21H
JC ERROR_TRAP2
;
MOV BX,AX
MOV AX,130H
MOV DS,AX
MOV AH,3FH
MOV ECX,IMG_LEN
XOR EDX,EDX
INT 21H
MOV AX,14H
MOV DS,AX
JC ERROR_TRAP2
;
MOV AH,3EH
INT 21H
JC ERROR_TRAP2
EXIT_PRG:
;CD ドライブ テイシ ジカン ノ セッテイ
MOV DL,20
CALL CD_TIME
;
MOV AX,4C00H
INT 21H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CD_TIME:
MOV AX,52C0H
MOV CH,0FFH
MOV CL,DL
INT 93H
TEST AH,AH
JNZ CD_TIME
RET
READ_CD:
MOV AX,4200H
MOV BX,[HANDLE]
MOVZX ECX,[HPAGE]
IMUL ECX,HEADLEN
MOV DX,CX
SHR ECX,16
INT 21H
;
MOV AH,3FH
MOV BX,[HANDLE]
MOV ECX,HEADLEN
MOV EDX,OFFSET HEADWRK
INT 21H
RET
;ヒョウジカイシイチ ノ セッテイ
OFFSET_0:
XOR EAX,EAX
MOV [OFFSETX],AX
MOV [OFFSETY],AX
ZOOM_0:
MOV [ZOOM],0
DISP_START:
MOV CX,[ZOOM]
ADD CX,2
;
CALL WRITE_PAGE_1
;
XOR EDX,EDX
CALL DISP_PAGE
;
MOV AX,202H
MOV DX,CX
MOV BX,CX
CALL EGB_CALL
;
MOV AX,200H
XOR EDX,EDX
XOR EBX,EBX
CMP AH,CL
JZ SHORT ZOOM_ZERO
;
CALL EGB_CALL
;
MOV AX,203H
MOV DX,256
MOV BX,240
JMP SHORT ZOOM_ELSE
;
ZOOM_ZERO:
MOV AL,3
MOV DX,256
MOV BX,240
CALL EGB_CALL
;
MOV AX,200H
MOV DX,64
XOR EBX,EBX
ZOOM_ELSE:
CALL EGB_CALL
;
CALL WRITE_PAGE_0
;
MOV AX,202H
MOV DX,CX
MOV BX,CX
CALL EGB_CALL
;
MOV AX,203H
MOV DX,320
MOV BX,256
CALL EGB_CALL
;
OFFSET_CHG:
CALL WRITE_PAGE_1
;
MOV AH,7
XOR ESI,ESI
XOR EDI,EDI
XOR EDX,EDX
CMP DX,[ZOOM]
JNZ SHORT OFFSET_ON
;
CALL SPRITE_CALL
;
MOV AX,201H
XOR EBX,EBX
CALL EGB_CALL
;
JMP SHORT OFFSET_NO
;
OFFSET_ON:
SUB SI,[OFFSETX]
CALL SPRITE_CALL
;
MOV AX,201H
MOV BX,[OFFSETY]
CALL EGB_CALL
;
MOV DX,[OFFSETX]
ADD DX,64
OFFSET_NO:
CALL WRITE_PAGE_0
;
MOV AX,201H
CALL EGB_CALL
;
MOV EDX,3
;ヒョウジ ページ ノ シテイ
DISP_PAGE:
MOV AX,601H
JMP SHORT EGB_CALL
;カキコミ ページ 0
WRITE_PAGE_0:
MOV AX,500H
JMP SHORT EGB_CALL
;カキコミ ページ 1
WRITE_PAGE_1:
MOV AX,501H
JMP SHORT EGB_CALL
;ゼンガメン ノ ショウキョ
CLEAR_SCREEN:
MOV AH,20H
EGB_CALL:
MOV EDI,OFFSET EGBWORK
CALL PWORD PTR FS:[20H]
RET
;スプライト ショキカ
INIT_SPRITE:
MOV AH,0
SPRITE_CALL:
CALL PWORD PTR FS:[60H]
RET
SOUND_CALL:
CALL PWORD PTR FS:[80H]
RET
FONT_CALL:
CALL PWORD PTR FS:[0A0H]
RET
;モジレツ ヒョウジ
PRINT_MSG:
CALL SJISSTRING
MOVZX EAX,WORD PTR [ESI+4]
LEA ESI,[ESI+EAX+6]
MOV AX,[ESI]
INC AX
JNZ SHORT PRINT_MSG
RET
;10シンスウ 4ケタ コンバート
CONVERT_D:
MOV CL,4
MOV ESI,OFFSET DECIMAL
CON_LOOP:
XOR EDX,EDX
DIV WORD PTR [ESI]
OR AL,'0'
STOSB
MOV AX,DX
ADD ESI,2
DEC CL
JNZ SHORT CON_LOOP
RET
;EGB_sjisString コウソク バン
SJISSTRING:
PUSHAD
XOR EAX,EAX
LODSW
MOV EDI,EAX
LODSW
SUB AL,15
SHL EAX,10
LEA EDI,[EAX+EDI*2]
LODSW
MOV CX,AX
DEC CX
JS SJISSTRING9
MOV AX,1CH
MOV ES,AX
SJISSTRING1:
LODSB
DEC CX
TEST AL,AL
JS SHORT SJISSTRING2
PUSH ESI
MOV BL,AL
XOR EAX,EAX
MOV DX,810H
CALL FONT_CALL
JMP SHORT SJISSTRING3
SJISSTRING2:
MOV BH,AL
LODSB
DEC CX
PUSH ESI
MOV BL,AL
MOV AH,2
CALL FONT_CALL
MOV AX,100H
MOV DX,1010H
CALL FONT_CALL
SJISSTRING3:
MOV BP,DX
MOV EBX,EDI
SJISSTRING4:
LODSB
NOT AL
MOV DL,AL
REPT 8
ADD DL,DL
SBB EAX,EAX
STOSW
ENDM
SUB DH,8
JNZ SJISSTRING4
LEA EDI,[EBX+400H]
MOV DX,BP
DEC DL
JNZ SJISSTRING3
MOVZX EAX,DH
LEA EDI,[EDI+EAX*2-4000H]
POP ESI
MOV AX,14H
MOV DS,AX
TEST CX,CX
JNS SJISSTRING1
MOV ES,AX
SJISSTRING9:
POPAD
RET
CSEG ENDS
;********************************************************************
DSEG SEGMENT DWORD PUBLIC USE32 'DATA'
PALTFIL DB DRIVE,':\DATA\PALETTE.32K',0
HEADFIL DB DRIVE,':\DATA\HEAD.DAT',0
DRIVE_R DB 'Q:\DRIVE_R.IMG',0
RUN386 DB 'R:\RUN386.EXE',0
WAIT_$ DW 16,100,36
DB '★☆★ ヘッド表示 Ver1.23 ★☆★'
DW 16,120,36
DB 'Programmed by Yasu.Hara.'
DW 16,140,36
DB 'CDからデータを読み込んでいま~っす'
DW 16,160,36
DB '♪~~しばらくお待ちくださいね~~♪'
DW -1
ERROR_$ DW 16,140,36
DB '富士通HabitatのCD-ROMを'
DW 16,160,36
DB '入れてから、何かキーを押してください'
DW -1
TMENU_$ DW 16,120,36
DB '《Towns-MENU》に戻りま~す'
DW 16,140,36
DB '♪~~ちょっとお待ちくださいね~~♪'
DW -1
ERROR2$ DW 16,100,36
DB 'スプライトメモリ(DRIVE R)に'
DW 16,120,36
DB 'RUN386.EXE を再ロードします'
DW 16,140,36
DB '<Towns-OS V1.1 L20> のCD-ROMを'
DW 16,160,36
DB '入れてから、何かキーを押してください'
DW -1
EXIT_$ DW 16,110,36
DB '『ヘッド表示プログラム』を終了します'
DW 16,130,36
DB '必要ならば、CD-ROMを入れ替えて'
DW 16,150,36
DB '準備できたら何かキーを押してください'
DW -1
LINE$ DW 32,40,32
DB 'ヘッドの種類:'
MAX_$ DB ' パレット番号:1'
DW -1
ATTR_$ DW 32+8*31,40,1
PAL_$ DB ' '
DW -1
NUMBER$ DW 32,68,4
DB ' '
DW 32,68+36,4
DB ' '
DW 32,68+36*2,4
DB ' '
DW 32,68+36*3,4
DB ' '
DW 32,68+36*4,4
DB ' '
DW 32+136,68,4
DB ' '
DW 32+136,68+36,4
DB ' '
DW 32+136,68+36*2,4
DB ' '
DW 32+136,68+36*3,4
DB ' '
DW 32+136,68+36*4,4
DB ' '
DW -1
EVEN
DECIMAL DW 1000,100,10,1
CLR_PAT DB 512 DUP(0)
OFFSETX DW 0
OFFSETY DW 0
ZOOM DW 0
PADWORK DW 0
PALTNUM DW 1
INPUT DW 0
HPAGE DW 0
HEADNUM DW 1
HEADOFF DW 0
HEADMAX DW 0
HANDLE DW 0
EXIST_R DW 0
EGBWORK DB EGBSIZE DUP(?)
PALTWRK DB PALTLEN DUP(?)
HEADWRK DB HEADLEN DUP(?)
DSEG ENDS
;********************************************************************
SSEG SEGMENT DWORD STACK USE32 'STACK'
DB 1000H DUP(?)
SSEG ENDS
;********************************************************************
END